import {ApiHost} from '@/config/common';
import RNFetchBlob from 'react-native-blob-util';
import {OssHost} from '@/config/common';
import {
  decode as base64ToArraybuffer,
  encode as arraybufferToBase64,
} from 'base64-arraybuffer';
export default async ({
  token,
  fileName,
  blobData, //二进制流
  arrayBufferData, //二进制数组
  base64str, //base64字符串
}) => {
  const body = blobData || arrayBufferData || base64ToArraybuffer(base64str);
  if (!fileName) {
    return {
      code: -1,
      msg: `!fileName`,
    };
  }
  const signRsObj = await (async () => {
    let rsObj = {};
    try {
      let res = await fetch(
        `${ApiHost}/file-system/json/get-account-write-private-sign`,
        {
          headers: {
            'content-type': 'application/json',
            token: token,
          },
          method: 'POST',
          body: JSON.stringify({
            fileName,
            method: 'PUT',
          }),
        },
      );
      rsObj = await res.json();
    } catch (e) {
      console.log(`网络异常`, e + '');
    }
    return rsObj;
  })();
  const {code = 0} = signRsObj || {};
  if (code <= 0) {
    return signRsObj;
  }
  const {method, objectUrl, objectName, headers} = signRsObj.data || {};

  const ossConfig = {
    method,
    objectUrl,
    objectName,
    headers,
  };
  console.log('headers', headers);
  console.log('objectUrl', objectUrl);
  console.log('objectName', objectName);

  try {
    // 详细fetch参考网址： https://www.ruanyifeng.com/blog/2020/12/fetch-tutorial.html
    // 上传二进制文件时，不用修改标头的Content-Type，浏览器会自动设置。
    // fetch()也可以直接上传二进制数据，将 Blob 或 arrayBuffer 数据放在body属性里面。
    let response = await fetch(objectUrl, {
      method: method,
      headers: headers,
      body: body,
    });

    // let res = await RNFetchBlob.fetch(method, objectUrl, {...headers}, body)
    //   .uploadProgress((written, total) => {
    //     console.log('uploaded', written / total);
    //   })
    //   // listen to download progress event
    //   .progress((received, total) => {
    //     console.log('progress', received / total);
    //   });
    // let text = res.text();
    // console.log('text', text);

    // response.text()：得到文本字符串。
    // response.json()：得到 JSON 对象。
    // response.blob()：得到二进制 Blob 对象。
    // response.formData()：得到 FormData 表单对象。
    // response.arrayBuffer()：得到二进制 ArrayBuffer 对象。
    // Headers.get()：根据指定的键名，返回键值。
    // Headers.has()： 返回一个布尔值，表示是否包含某个标头。
    // Headers.set()：将指定的键名设置为新的键值，如果该键名不存在则会添加。
    // Headers.append()：添加标头。
    // Headers.delete()：删除标头。
    // Headers.keys()：返回一个遍历器，可以依次遍历所有键名。
    // Headers.values()：返回一个遍历器，可以依次遍历所有键值。
    // Headers.entries()：返回一个遍历器，可以依次遍历所有键值对（[key, value]）。
    // Headers.forEach()：依次遍历标头，每个标头都会执行一次参数函数。

    // const response2 = response.clone();
    console.log('\n');
    for (let [key, value] of response.headers) {
      console.log(`${key} : ${value}`);
    }
    console.log('\n');

    const crc64ecma = response.headers.get('x-oss-hash-crc64ecma') + '';
    if (!crc64ecma || crc64ecma === 'null' || crc64ecma === '0') {
      return {
        code: -2005,
        msg: 'fail',
        reason: '!crc64ecma || crc64ecma === "0"',
      };
    }

    // Response.body属性是 Response 对象暴露出的底层接口，返回一个 ReadableStream 对象，供用户操作。它可以用来分块读取内容，应用之一就是显示下载的进度。
    // const reader = response.body.getReader();
    // while (true) {
    //   const {done, value} = await reader.read();
    //   if (done) {
    //     break;
    //   }
    //   console.log(`Received ${value.length} bytes`);
    // }
  } catch (e) {
    return {
      code: -9000,
      msg: 'fail',
      error: e.message,
    };
  }

  return {
    code: 1,
    msg: 'success',
  };
};
